#include "timer.h"

uint32_t timeCount = 0; // 定义变量，用来计时

void TIM3_NVIC_Config(void); // 声明TIM3_NVIC_Config函数

/*
 *函数名称：TIM3_Init
 *函数功能：初始化定时器TIM3
 *参数：无
 *返回值：无
 *备  注：无
 */
void TIM3_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    // 启用 TIM3 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    // 配置 TIM3 参数
    TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;               // 预分频器，将时钟分频为 72 MHz / (72 - 1 + 1) = 1 MHz，每个计数单位为1微秒。
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;                // 定时器的周期值，确定定时器溢出的时间，设置为 1000 - 1 以实现 1 毫秒的定时。
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 定时器计数模式，设置为向上计数。
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     // 时钟分频配置，不分频（分频因子为 1）。
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);             // 将上述配置应用到 TIM3 定时器。

    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 开启更新中断

    TIM3_NVIC_Config(); // 配置NVIC

    TIM_Cmd(TIM3, ENABLE); // 开启定时器
}

/*
 *函数名称：TIM3_NVIC_Config
 *函数功能：TIM3的中断配置
 *参数：无
 *返回值：无
 *备  注：无
 */
static void TIM3_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;           // 指定中断通道
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // 中断使能
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        // 设置响应优先级
    NVIC_Init(&NVIC_InitStructure);
}

/*
 *函数名称：TIM3_Count
 *函数功能：定时器计数
 *参数：无
 *返回值：计数时间(us)
 *备  注：无
 */
uint32_t TIM3_Count(void)
{
    u32 t = 0;

    t = timeCount * 1000;      // 得到ms
    t += TIM_GetCounter(TIM3); // 得到us
    TIM_SetCounter(TIM3, 0);   // 将TIM3计数寄存器的计数值清零

    delay_ms(5);

    return t;
}

/*
 *函数名称：TIM3_Open
 *函数功能：打开定时器
 *参数：无
 *返回值：无
 *备  注：无
 */
void TIM3_Open(void)
{
    TIM_SetCounter(TIM3, 0); // 清除计数
    timeCount = 0;
    TIM_Cmd(TIM3, ENABLE); // 使能TIMx外设
}

/*
 *函数名称：TIM3_Close
 *函数功能：关闭定时器
 *参数：无
 *返回值：无
 *备  注：无
 */
void TIM3_Close(void)
{
    TIM_Cmd(TIM3, DISABLE); // 使能TIMx外设
}

/*
 *函数名称：TIM3_IRQHandler
 *函数功能：TIM3中断服务函数
 *参数：无
 *返回值：无
 *备  注：无
 */
void TIM3_IRQHandler(void) // 更新中断函数，用来计时，每1毫秒变量time加1
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // 获取TIM3定时器的更新中断标志位
    {

        TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除更新中断标志位

        timeCount++; // 增加溢出次数
    }
}
